/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladores;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.String;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Vector;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import modelos.ModeloProducto;

/**
 *
 * @author usuario
 */
public class ControladorOrden implements ActionListener{

    private vistas.VistaOrden vista;
    private modelos.ModeloOrden modelo;
    private LinkedList<ModeloProducto> prodcutos;
    private final DefaultTableModel modeloTabla;
    private Vector<String> fila;

    public ControladorOrden(vistas.VistaOrden aThis) {
        vista=aThis;
        modelo= new modelos.ModeloOrden();
        prodcutos= new ModeloProducto().listar();
        cargarDescripciones();
        vista.addListener(this);
        modeloTabla = new DefaultTableModel();
        fila = new Vector<String>();
        vista.getTblProdcuto().setModel(modeloTabla);
        fila.add("Producto");
        fila.addElement("Precio");
        fila.add("Cantidad");
        fila.add("Sub-Total");
        modeloTabla.setColumnIdentifiers(fila);
        cargarComboCantidad();
    }

    public boolean actualizar(){
        for (int i = 0; i < modeloTabla.getRowCount(); i++)
            if(modeloTabla.getValueAt(i, 0).equals(vista.getCmbProducto().getItemAt(vista.getCmbProducto().getSelectedIndex()))){
                int c = Integer.parseInt(""+vista.getCmbCantidad().getItemAt(vista.getCmbCantidad().getSelectedIndex()));
                double sub = Double.parseDouble(""+modeloTabla.getValueAt(i, 1))*c;
                modeloTabla.setValueAt(""+sub, i, 3);
                return true;
            }
        return false;
    }


    public void agregarFila(String[] v){
        float total;
        if(!vista.getTotal().getText().isEmpty())
            total = Float.parseFloat(vista.getTotal().getText());
        else
            total=0;
        if(!actualizar()){
            int c = Integer.parseInt(""+vista.getCmbCantidad().getItemAt(vista.getCmbCantidad().getSelectedIndex()));
            fila= new Vector<String>();
            fila.add(v[0]);
            fila.add(v[1]);
            fila.add(""+c);
            float sub = (Float.parseFloat(v[1])*c);
            fila.add("" + sub);
            total+=sub;
            vista.getTotal().setText(""+total);
            modeloTabla.addRow(fila);
        }
    }


    public void calcularTotal(){
        float total =0;
        for (int i = 0; i < modeloTabla.getRowCount(); i++)
            total+=Float.parseFloat(""+modeloTabla.getValueAt(i, 3));
        vista.getTotal().setText(""+total);
    }

    public void quitar(){
        int i = vista.getTblProdcuto().getSelectedRow();
        if(i != -1){
            float t = Float.parseFloat(vista.getTotal().getText())-Float.parseFloat((String) modeloTabla.getValueAt(i, 3));
            modeloTabla.removeRow(i);
            vista.getTotal().setText(""+t);
        }

        else
            JOptionPane.showMessageDialog(new JFrame(),"Debe seleccionar el regitstro que desea quitar","Comida Rapida",JOptionPane.ERROR_MESSAGE);
    }

     public void reiniciar(){
         for (JTextField texto : vista.getTextos()) {
            texto.setText("");
        }
         vista.getCmbCantidad().setSelectedIndex(0);
         vista.getCmbProducto().setSelectedIndex(0);
        modeloTabla.setRowCount(0);
     }

    public void cargarComboProductos(Vector<String> descripciones){
        vista.getCmbProducto().removeAllItems();
        for (int i = 0; i < descripciones.size(); i++) {
            vista.getCmbProducto().addItem(descripciones.elementAt(i));

        }
    }

    public void cargarComboCantidad(){
        for (int i = 1; i <= 100; i++)
            vista.getCmbCantidad().addItem(i);
    }

    public void cargarDescripciones(){
        Vector<String> descripciones = new Vector<String>();
        for (int i = 0; i < prodcutos.size(); i++)
            descripciones.add(prodcutos.get(i).getDescripcion());
        cargarCombo(vista.getCmbProducto(),descripciones);
    }


     public void cargarCombo(JComboBox combo,Vector<String> info){
        for (String string : info) {
            combo.addItem(string);
        }
    }


     public ModeloProducto buscarProducto(String descrpicion){
        for (int i = 0; i < prodcutos.size(); i++)
            if(prodcutos.get(i).getDescripcion().equals(descrpicion))
                return prodcutos.get(i);
        return null;
    }

     public void actionPerformed(ActionEvent ae) {
         if(ae.getSource().equals(vista.getRegistrar())){
                registrar();

        }
        else if(ae.getSource().equals(vista.getSalir())){
            vista.setVisible(false);
            reiniciar();
        }
        else if(ae.getSource().equals(vista.getMas())){
            agregar();
        }
        else if(ae.getSource().equals(vista.getMenos())){
            quitar();
        }
        else{
            reiniciar();
        }
    }

    private void registrar() {
       LinkedList<JTextField> v =vista.getTextos();
       for (Iterator<JTextField> it = v.iterator(); it.hasNext();) {
           JTextField texto = it.next();
            if(texto.getText().equals("")){
                JOptionPane.showMessageDialog(new JFrame(),"Campos vacios","Calle el Hambre Aeropuerto",JOptionPane.INFORMATION_MESSAGE);
                return;
            }
       }
       modelo.setCodigo(vista.getCodigo().getText());
       modelo.setCedula(vista.getCedula().getText());
       modelo.setTotal(Float.parseFloat(vista.getTotal().getText()));
       modelo.setNombre(vista.getNombre().getText());
       modelo.setStatus("A");
       if(modelo.registar()){
           Vector<String> c = new Vector<String>();
           Vector<Integer> p = new Vector<Integer>();
           LinkedList<String []> f= getInfoTabla();
           for (Iterator<String[]> it = f.iterator(); it.hasNext();) {
               String[] s = it.next();
               c.add(buscarProducto(s[0]).getId());
               p.add(Integer.parseInt(s[1]));
           }
           modelo.registarProductos(c, p);
           for (int i = 0; i < c.size(); i++) {
               System.out.println("ausssssss");
               modelos.ModeloProducto m = new modelos.ModeloProducto();
               m.setId(c.elementAt(i));
               m.disminuirStockIngredientes();
           }
           JOptionPane.showMessageDialog(new JFrame(),"Orden registrada exitosamente","Calle el Hambre Aeropuerto",JOptionPane.INFORMATION_MESSAGE);
           reiniciar();
       }
       else
           JOptionPane.showMessageDialog(new JFrame(),"El codigo ya se encuentra registrada","Calle el Hambre Aeropuerto",JOptionPane.INFORMATION_MESSAGE);

    }

    public int getCantidad() {
        return (Integer)vista.getCmbCantidad().getItemAt(vista.getCmbCantidad().getSelectedIndex());
    }


    private void agregar() {
        LinkedList<String[]> v= getInfoTabla();
        modelos.ModeloProducto producto = buscarProducto(vista.getTextoCmbProducto());
        int n =getCantidad();
        int i = 0;
        while(i < n) {
            if(!producto.revisarDisponibilidadIngredientes()){
                JOptionPane.showMessageDialog(new JFrame(),"Dsiculpe no podemos atender su orden","Calle el Hambre Aeropuerto",JOptionPane.WARNING_MESSAGE);
                return;
            }
            i++;
        }
        agregarFila(vista.getRegistro());
    }

    private LinkedList<String[]> getInfoTabla() {
        LinkedList<String []> v = new LinkedList<String[]>();
        for (int i = 0; i < modeloTabla.getRowCount(); i++){
            String [] s = new String [] {""+modeloTabla.getValueAt(i, 0),""+modeloTabla.getValueAt(i, 2)};
            v.add(s);
         }
         return v;
    }
}
